202506262333 go 协程调度的抢占机制
202506262333 go 协程调度的抢占机制
Go 1.14 之前的版本(无抢占机制)
早期Go的调度器是协作式调度,协程只在特定时机(如函数调用、通道操作、time.Sleep
等)主动让出CPU。死循环中若没有这些操作,调度器无法抢占执行权。
Go 1.14 及之后版本(引入抢占机制)
调度器引入了基于信号的异步抢占
即使协程执行死循环,操作系统会向运行该协程的线程发送信号(如SIGURG
)
信号处理函数会触发调度器强制切换协程,释放当前P。
死循环不再能永久阻塞调度,P会被其他协程复用。
- 极端情况:极少数场景下(如循环中无函数调用且编译器未插入抢占检查),抢占可能延迟,但最终仍会发生。